#include<iostream>
#include<unistd.h>
#include<cstring>
#include<cassert>
#include<string>
#include<signal.h>
#include<sys/types.h>
using namespace std;
void printsig(sigset_t& pending )
{
    cout<<"pending bit map..."<<endl;
    for(int signo = 31; signo > 0; signo--)
    {
        if(sigismember(&pending,signo))//判断signo信号是否在pending集合中
        {
            cout<<"1";
        }
        else{
            cout<<"0";
        }
        cout<<endl;
    }
}
int main()
{
    //屏蔽2号信号
    sigset_t block,oblock;//创建自己的信号集
    sigemptyset(&block);//清空block信号集
    sigemptyset(&oblock);
    sigaddset(&block,2);//将二号信号添加到信号集中

    //1. 开始屏蔽二号信号，就是将信号集写入内核中
    int n = sigprocmask(SIG_SETMASK,&block, &oblock);
    assert(n == 0);
    (void)n;//骗过编译器，不要告警，因为后面要用到n，不光是定义。

    cout<<"block 2 signal success ... "<<endl;
    while(true)
    {
        //2. 获取 进程的pending位图
        sigset_t pending;
        sigemptyset(&pending);
        n = sigpending(&pending);//将当前进程的pending位图写入pending信号集中

        //3. 打印pending位图中收到的信号
        printsig(pending);
        sleep(1);
    }
    return 0;
}


















// int main(int argc,char* argv[])
// {
//     if(argc != 3)
//     {
//         cout<<"Usage: "<<argv[0]<<" -signnumber -pid"<<endl;
//     }
//     int signumber = stoi(argv[1]+1);//计算是什么信号
//     int pid = stoi(argv[2]);//获得要对什么进程进行操作
//     int n = kill(pid,signumber);//系统调用
//     if(n < 0)
//     {
//         cerr<<" kill error,"<< strerror(errno)<<endl;
//     }

//     return 0;
// }






























// void handler(int signal)
// {
//     std::cout<< "get signal ,number is : "<< signal <<std::endl;
// }
// int main()
// {
//     signal(SIGINT,handler);//设置对应信号的处理方法。--只有在接受到该信号时，handler方法才会被调用。
//     //ctrl + c 被OS解释为二号信号，--->向目标进程发送-->进程收到，-->进程响应
//     //signal(SIGINT,SIG_IGN);ignorebei1
//     while(true)
//     {
//         std::cout<< " I am active ... "<<getpid()<<std::endl;
//         sleep(1);
//     }
//     return 0;
// }